package com.audaque.springboot.foshanupload.web.shirodemo.controller;

import com.audaque.springboot.foshanupload.core.result.R;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.*;

/**
 * @author zgb
 * @desc ...
 * @date 2022-08-05 17:14:04
 */

@RestController
@RequestMapping("shiro")
public class ShiroController {
    //登录：如果拦截的 URL 是 POST loginUrl 登录请求，则基于请求表单的 username、password 进行认证。认证通过后，默认重定向到 GET loginSuccessUrl 地址。
    @PostMapping("/login")
    public R login(@RequestParam(value = "account") String account,
                   @RequestParam(value = "password") String password) {
        Subject userSubject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(account, password);
        try {
            // 登录验证
            userSubject.login(token);
            return R.ok();
        } catch (UnknownAccountException e) {
            return R.error("账号不存在");
        } catch (DisabledAccountException e) {
            return R.error("账号被禁用");
        } catch (IncorrectCredentialsException e) {
            return R.error("账号或密码错误");
        } catch (Throwable e) {
            e.printStackTrace();
            return R.error();
        }
    }
    //跳转到登录页面：如果拦截的 URL 是 GET loginUrl 登录页面，则进行该请求，跳转到登录页面。
    @GetMapping("/login")
    public R login() {
        return R.error("账号未登录,前端跳转到登录路由");
    }
    //访问资源：如果拦截的 URL 是其它 URL 时，则记录该 URL 到 Session 中。在用户登录成功后，重定向到该 URL 上。
    @GetMapping("/auth")
    public String auth() {
        return "已成功登录";
    }
    //需要角色
    @GetMapping("/role")
    @RequiresRoles("vip")
    public String role() {
        return "测试Vip角色";
    }
    //需要权限
    @GetMapping("/permission")
    @RequiresPermissions(value = {"add", "update"}, logical = Logical.AND)
    public String permission() {
        return "测试Add和Update权限";
    }
}
